<?php

namespace app;

use thans\jwt\exception\TokenBlacklistGracePeriodException;
use think\db\exception\DataNotFoundException;
use think\db\exception\ModelNotFoundException;
use think\exception\Handle;
use think\exception\HttpException;
use think\exception\HttpResponseException;
use think\exception\ValidateException;
use think\Response;
use Throwable;

/**
 * 应用异常处理类
 */
class ExceptionHandle extends Handle
{
	/**
	 * 不需要记录信息（日志）的异常类列表
	 * @var array
	 */
	protected $ignoreReport = [
		HttpException::class,
		HttpResponseException::class,
		ModelNotFoundException::class,
		DataNotFoundException::class,
		ValidateException::class,
	];
	
	/**
	 * 记录异常信息（包括日志或者其它方式记录）
	 *
	 * @access public
	 * @param Throwable $exception
	 * @return void
	 */
	public function report(Throwable $exception): void
	{
		// 使用内置的方式记录异常日志
		parent::report($exception);
	}
	
	/**
	 * Render an exception into an HTTP response.
	 *
	 * @access public
	 * @param \think\Request $request
	 * @param Throwable $e
	 * @return Response
	 */
	public function render($request, Throwable $e): Response
	{
		
		// 添加自定义异常处理机制
		// 在生产环境下返回code信息
		if (!env('APP_DEBUG', true)) {
			$msg = '请求错误,请稍后再试';
			$data = '';
			$code = 0;
			$statuscode = 500;
			$response = method_exists($e, 'getResponse') ? $e->getResponse() : null;
			if ($e instanceof ValidateException) {
				$statuscode = 200;
				$msg = $e->getError();
			} elseif ($e instanceof HttpException) {
				$statuscode = $code = $e->getStatusCode();
			} elseif ($e instanceof HttpResponseException) {
				$ResponseDate = $response->getData();
				$statuscode = $response->getCode();
				$header = $response->getHeader();
				$code = $ResponseDate['code'];
				$data = $ResponseDate['data'];
				$msg = $ResponseDate['msg'];
			} elseif ($e instanceof ModelNotFoundException || $e instanceof DataNotFoundException) {
				$statuscode = 200;
				$msg = '数据查询为空';
				if ($e->getModel() == 'app\model\User'){
					$code = 401;
					$msg = '请重新登录';
				}
				
			}
			return json(['code' => $code, 'msg' => $msg, 'time' => $request->server('REQUEST_TIME'), 'url' => $request->controller() . '/' . $request->action(), 'data' => $data], $statuscode, $header ?? []);
		}
		
		// 其他错误交给系统处理
		return parent::render($request, $e);
	}
}
